# -- coding: utf-8 --
# @time :
# @author : 周梦泽
# @file : .py
# @software: pycharm
# 此程序用于数据清洗相关

from config import data as yaml_data
import pandas as pd
from common.utils.ExcelUtil import del_english_keywords
from common.logger.log import log_
import os


class DataClean:
    def __init__(self):
        """
        初始化变量
        """
        self.path = yaml_data.get('download_path.path') + 'gjc/gjc_data'
        current_dir = os.path.dirname(os.path.abspath(__file__))
        self.folder_path = os.path.abspath(os.path.join(current_dir, '../../../../../' + self.path))

    def data_tidy(self, params: dict, total_df: pd.DataFrame):
        """
        数据整理
        1、拿到所有数据DataFrame
        2、去除空值与[-]数据
        3、按照交易金额降序排列
        4、修改数据累心Dtype ->float64
        5、按条件筛选数据
        6、数据去重
        7、查找数据并标红
        :param total_df: 读取到的文件夹内所有csv文件合并结果
        :param params :包含以下参数：
            block_words: 需要屏蔽的关键词
            deal_num:   交易金额大于多少标红色
            hot_index: 搜索人数/在线 商品大于等于多少的标红色
            pay_num: 支付人数小于多少的数据删除
            deal_value: 交易金额小于多少的数据删除
            price: 客单价小于等于多少的数据删除
        :return:
        """
        log_.info('参数初始化')
        block_words = params.get('blockWords')
        deal_num = float(params.get('dealNum'))
        hot_index = float(params.get('hotIndex'))
        pay_num = float(params.get('payNum'))
        deal_value = float(params.get('dealValue'))
        price = float(params.get('price'))
        rm_english = params.get('rmEnglish')

        # log_.info('开始整合数据')
        # 将所有数据合并到一个表中
        log_.info('正在去除空值')
        dropna_df = total_df.dropna(subset=['交易金额'], how='any')
        # dropna()方法并指定subset参数为包含所有要清除空值的列名的列表，然后指定how = 'any'表示只要任何一个列中存在空值就清除该行。
        # sort_values()方法并指定by参数为包含所有要排序的列名的列表，然后指定ascending参数为True表示升序排列。
        dropna_df = dropna_df[~dropna_df['交易金额'].isin(['-'])]
        # 去除空值[-]   ~:取反    原理：获取到 带有”-“的所有数据，然后取反，去除掉带了有”-“的数据
        log_.info('修改列数据类型')
        dropna_df[['客单价', '交易金额', '支付人数', '搜索人数/在线商品数']] = \
            dropna_df[['客单价', '交易金额', '支付人数', '搜索人数/在线商品数']].astype('float64')
        # 将数据类型转换为float64
        log_.info('数据筛选-客单价-交易金额-支付人数')
        data_df = dropna_df[(dropna_df['客单价'] >= price)
                            & (dropna_df['交易金额'] >= deal_value)
                            & (dropna_df['支付人数'] >= pay_num)]
        # 筛选出客单价大于price，交易金额大于deal_value，支付人数大于pay_num的数据
        log_.info('数据去重')
        data_df = data_df.drop_duplicates(subset='关键词', keep='first') \
            .sort_values(by='交易金额', ascending=False).reset_index(drop=True)

        # 去重
        log_.info('屏蔽关键词')
        mask = False
        for block_word in block_words:
            mask |= data_df['关键词'].str.contains(block_word)

        data_df = data_df[~mask]
        # 屏蔽关键词
        if rm_english:
            log_.info('删除关键词中的英文')
            data_df = del_english_keywords(data_df, '关键词')

        data_df.reset_index(drop=True, inplace=True)
        # 重置索引, 要不然在生成表格时会报错
        log_.info('查找筛选数据并标红')
        flag = (data_df['搜索人数/在线商品数'] > hot_index) & (data_df['交易金额'] > deal_num)
        styler = data_df.style.applymap(self.highlight_red_font, num=hot_index, subset=['搜索人数/在线商品数']) \
            .applymap(self.highlight_red_font, num=deal_num, subset=['交易金额']) \
            .applymap(lambda x: 'color: red' if x in data_df.loc[flag, '关键词'].tolist() else '')
        # 设置样式, 文件保存
        # date_time_string = datetime.today().strftime('%Y-%m-%d_%H-%M-%S')
        # file_name = f'gjc_data_{date_time_string}.xlsx'
        # with pd.ExcelWriter(self.folder_path + '/result/{}'.format(file_name)) as writer:
        #     styler.to_excel(writer, sheet_name='行业前十延申词', index=False)
        # log_.info('文件路径：{}'.format(self.folder_path + '/result/{}'.format(file_name)))
        return data_df, styler

    @staticmethod
    def highlight_red_font(x, num):
        """
        :param x:单元格，不需要传，applymap方法会自动将表格中的每个单元格传入
        :param num:比较值
        :return:
        """
        if x >= num:
            return 'color: red'
        else:
            return ''
